! Roel Matthysen
! s0202264
! Finale versie Project Deel 1
program matrixexp
	use methods
	use IO
	implicit none	
	INTEGER :: i,arguments,n, algorithm=1
        CHARACTER(len=32) :: arg
	logical :: execute = .true.,verbose = .false.
	integer, parameter :: doubleprecision = kind(0.d0)
	real(doubleprecision),allocatable :: A(:,:),RES(:,:) 
	i = 1
	arguments = command_argument_count()    
	! Overlopen van alle argumenten    
	do while (i<=arguments)
        	CALL get_command_argument(i, arg)
		select case (arg)
              	case('--version')
			write(0,'(a,/,a)') 'versie 2.4','Roel Matthysen (1e Master WIT)'
			! Als versie wordt opgevraagd wordt het hoofdprogramma niet uitgevoerd
			execute = .false.
		case('--help')
			write(0,'(a)') ' '
			write(0,'(a)') 'HELP MATRIXEXP'
			write(0,'(a)') ' '
			write(0,'(a)') '    Dit programma rekent voor een gegeven matrix de matrixexponentiële' 			
			write(0,'(a)') '    uit. Indien geen invoer en uitvoer meegegeven worden wordt er' 				
			write(0,'(a)') '    ingelezen en uitgeschreven op de standaardstream. De invoer moet' 				
			write(0,'(a)') '    op de eerste lijn de dimensie van de matrix hebben, en op de' 			
			write(0,'(a)') '    volgende lijnen de data.'
			write(0,'(a)') ' '
			write(0,'(a)') 'OPTIONS'
			write(0,'(a)') ' '
			write(0,'(a)') '    --version           Toont informatie over versie en auteur'
			write(0,'(a)') ' '
			write(0,'(a)') '    --help              Toont deze boodschap'
			write(0,'(a)') ' '
			write(0,'(a)') '    --algorithm [ALG]   Keuze voor het algoritme. De keuzes voor ALG zijn:'
			write(0,'(a)') '                        taylorexp:  Op basis van reeksontwikkeling'
			write(0,'(a)') '                        eig:        Op basis van de eigenwaardenontbinding'
			write(0,'(a)') '                        eigqr:      Op basis van de eigenwaardenontbinding'
			write(0,'(a)') '                                    en QR-ontbinding'
			write(0,'(a)') ' '
			write(0,'(a)') '    --verbose           Zet het printen van debugging-informatie'
			write(0,'(a)') '                        voor eigqr aan.'
			! Als de help wordt opgevraagd wordt het hoofdprogramma niet uitgevoerd.
			execute = .false.
		case('--algorithm')
			i = i+1
			call get_command_argument(i,arg)
			select case (arg)
			case('taylor')
				algorithm = 1
				print *, 'taylor'
			case('eig')
				algorithm = 2
				print *, 'eig'
			case('eigqr')
				algorithm = 3
				print *, 'eigQR'
			case default
				write(0,'(3a)') 'Algorithm ',arg,' is not supported'
				execute = .false.
			end select
		case('--verbose')
			verbose = .true.
		case default
			write(0,'(2a)') 'Incorrect parameter ',arg
		end select
		i=i+1
        END DO
	if (execute) then
		! Read data
		read(5,*) n
		allocate(A(n,n))
		allocate(RES(n,n))
		do i=1,n
			read(5,*) A(i,:)
		enddo

		! Execute different commands
		select case(algorithm)
		case(1)
			RES = taylorexp(A,verbose)
		case(2)
			RES = eig(A,verbose)
		case(3)
			RES = eigqr(A,verbose)
		case default
		end select

		! Output data
		call printmatrix(RES)

		! Deallocate data
		deallocate(A)
		deallocate(RES)	
	endif

end program
